#ifndef MEMINFO_H
# define MEMINFO_H

#include "linuxos.h"

#define SWAP_TOTAL_TAG "SwapTotal"
#define SWAP_FREE_TAG "SwapFree"

typedef struct _MemoryInfo {
    // Phy Memory
    long MemTotal;
    long MemFree;
    long MemAvailable;
    long Buffers;
    long Cached;
    // Swap
    long SwapTotal;
    long SwapFree;

    // Shared
    long Shmem; 

    // Kernel
    long Slab;
    long SReclaimable;
    long SUnreclaim;

    // Other
    long MemUsed;
    double MemPrecent;
    long SwapUsed;
    double SwapPrecent;
} MemoryInfo;

static const char proc_meminfo_properties[][20] = {"MemTotal",         // 0
                                            "MemFree",          // 1
                                            "MemAvailable",     // 2
                                            "Buffers",          // 3
                                            "Cached",           // 4

                                            "SwapTotal",        // 5
                                            "SwapFree",         // 6

                                            "Shmem",            // 7

                                            "Slab",             // 8
                                            "SReclaimable",     // 9
                                            "SUnreclaim",       // 10
                                            };


// ![0]
static bool meminfo_of_buffer(char *buf, MemoryInfo *memory);
// ![0]

static bool proc_meminfo_of_buffer(char *buf, MemoryInfo *memory);

bool initMemory(MemoryInfo *memory);

#endif


// free
// ┌──────────────────────────────────────────────────────────────────────────────┐
// │              total       used       free     shared    buffers     cached    │
// │ Mem:       1523716    1272812     250904      24684     115624     810272    │
// │ -/+ buffers/cache:     346916    1176800                                     │
// │ Swap:            0          0          0                                     │
// └──────────────────────────────────────────────────────────────────────────────┘

// ┌──────────────────────────────────────────────────────────────────────────────┐
// │ bash-4.4# free -h                                                            │
// │ BusyBox v1.27.2 (2021-03-09 19:00:58 CST) multi-call binary.                 │
// │                                                                              │
// │ Used: free [-b/k/m/g]                                                       │
// │                                                                              │
// │ Display the amount of free and used system memory                            │
// └──────────────────────────────────────────────────────────────────────────────┘

// ┌──────────────────────────────────────────────────────────────────────────────┐
// │ bash-4.4# free -b                                                            │
// │              total       used       free     shared    buffers     cached    │
// │ Mem:    1560285184 1302564864  257720320   25280512  118448128  829652992    │
// │ -/+ buffers/cache:  354463744 1205821440                                     │
// │ Swap:            0          0          0                                     │
// │ bash-4.4# free -k                                                            │
// │              total       used       free     shared    buffers     cached    │
// │ Mem:       1523716    1272152     251564      24692     115688     810212    │
// │ -/+ buffers/cache:     346252    1177464                                     │
// │ Swap:            0          0          0                                     │
// │ bash-4.4# free -m                                                            │
// │              total       used       free     shared    buffers     cached    │
// │ Mem:          1488       1242        245         24        112        791    │
// │ -/+ buffers/cache:        338       1149                                     │
// │ Swap:            0          0          0                                     │
// │ bash-4.4# free -g                                                            │
// │              total       used       free     shared    buffers     cached    │
// │ Mem:             1          1          0          0          0          0    │
// │ -/+ buffers/cache:          0          1                                     │
// │ Swap:            0          0          0                                     │
// └──────────────────────────────────────────────────────────────────────────────┘

// cat /proc/meminfo
// ┌──────────────────────────────────────────────────────────────────────────────┐
// │ MemTotal:        1523716 kB                                                  │
// │ MemFree:          251744 kB                                                  │
// │ MemAvailable:    1221200 kB                                                  │
// │ Buffers:          115640 kB                                                  │
// │ Cached:           810204 kB                                                  │
// │ SwapCached:            0 kB                                                  │
// │ Active:           527848 kB                                                  │
// │ Inactive:         571364 kB                                                  │
// │ Active(anon):     184036 kB                                                  │
// │ Inactive(anon):    14004 kB                                                  │
// │ Active(file):     343812 kB                                                  │
// │ Inactive(file):   557360 kB                                                  │
// │ Unevictable:           0 kB                                                  │
// │ Mlocked:               0 kB                                                  │
// │ SwapTotal:             0 kB                                                  │
// │ SwapFree:              0 kB                                                  │
// │ Dirty:                 0 kB                                                  │
// │ Writeback:             0 kB                                                  │
// │ AnonPages:        173368 kB                                                  │
// │ Mapped:            43992 kB                                                  │
// │ Shmem:             24684 kB                                                  │
// │ Slab:             117896 kB                                                  │
// │ SReclaimable:      89132 kB                                                  │
// │ SUnreclaim:        28764 kB                                                  │
// │ KernelStack:        4528 kB                                                  │
// │ PageTables:         2632 kB                                                  │
// │ NFS_Unstable:          0 kB                                                  │
// │ Bounce:                0 kB                                                  │
// │ WritebackTmp:          0 kB                                                  │
// │ CommitLimit:      761856 kB                                                  │
// │ Committed_AS:    1341340 kB                                                  │
// │ VmallocTotal:   263061440 kB                                                 │
// │ VmallocUsed:           0 kB                                                  │
// │ VmallocChunk:          0 kB                                                  │
// │ CmaTotal:           4096 kB                                                  │
// │ CmaFree:            3060 kB                                                  │
// │ HugePages_Total:       0                                                     │
// │ HugePages_Free:        0                                                     │
// │ HugePages_Rsvd:        0                                                     │
// │ HugePages_Surp:        0                                                     │
// │ Hugepagesize:       2048 kB                                                  │
// └──────────────────────────────────────────────────────────────────────────────┘